學習紀錄 II

學習紀錄 $\rm II$

$\rm Python$

由於最近再寫$\rm pygame$就來整理下遇到的問題跟想法

if __name__ == '__main__'

這段程式碼主要是在引用其它 $\rm Python$ 檔的時候會需要用到

直接用範例來解釋

  • 假設有一個檔案叫做 $\rm BigXX$ 好了

    1
    2
    3
    4
    5
    6
    # BigXX.py

    def fun_inc() :
    print('Do something')

    print('give you a BigXX')
  • 假設有另一個檔案叫做 $\rm QQ$ 好了

1
2
3
4
5
6
# QQ.py

from BigXX import *

print('QQ')
fun_inc()

當我們執行 $\rm QQ.py$ 時我們希望的結果

1
2
QQ
Do something

可其結果為

1
2
3
give you a BigXX
QQ
Do something

這表示 $\rm BigXX$ 中的主程式也被執行了

  • 原因

    • 當 $\rm Python$ 檔案、模組被引用時其內部程式碼會被 $\rm Python$ 直譯器一行行讀取,所以 $\rm BigXX$
    • $\rm Python$ 直譯器在讀取程式碼時會有一些內建、隱含的變數,__name__就是其中之一
      • 若該檔案是透過cmd來執行其值會是__main__
      • 若該檔案是被引用的,其值會是其檔案名稱
  • 結果

    • 當我們執行 $\rm QQ.py$ 時,引用了 $\rm BigXX.py$
      • $\rm QQ.py$ 的 __nme__ 數值為 __main__
      • $\rm BigXX.py$ 的 __name__ 數值為 BigXX

為了達到我們一開始所希望的執行結果
將 $\rm BigXX$ 中的內容增加為

1
2
3
4
5
6
7
# BigXX.py

def fun_inc() :
print('Do something')

if __name__ == __main__ :
print('give you a BigXX')

這樣的話當我們在執行 $\rm QQ.py$ 時引用的 $\rm BigXX.py$ 將不會執行 print('give you a BigXX') 這段程式,而當我們想進行測試時直接運行 $\rm BigXX.py$ 可將其顯示出來

  • 結論
    • if __name__ == '__main__' 其主要意義為將該程式區分為二種狀況
      • 單獨執行
      • 被引用